﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Linq;
using System.Linq;
using System.Text;
using InfoTech.Core.Data;
using InfoTech.Core.Data.SqlClient;
using InfoTech.Core.Service;
using InfoTech.LanTranh.MucVu.Bussiness;

namespace InfoTech.LanTranh.MucVu.Service
{
    public class ReportService : BaseService
    {
        public static string RuaToi(string year)
        {
            int i = 0;
            int.TryParse(year, out i);
            DataItem dataItem = new DataItem();
            dataItem["Year"] = i;
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout(dataItem, "sp_Report_RuaToi"));
        }

        private static string FormatResult(DataTable dataTable)
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.Append(
            "<html><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"><title>Giáo Xứ Lán Tranh</title><body>");
            stringBuilder.Append("<style type=\"text/css\"> table { border: 1px solid #95B3D7; } table td { border: 1px solid #95B3D7; } .header { background-color: #4BACC6; border: 1px solid #95B3D7; color: White; padding: 5px; } .alterrow { background-color: #D2EAF1; } </style>");
            stringBuilder.Append("<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">");
            stringBuilder.Append("<tr>");
            foreach (DataColumn column in dataTable.Columns)
            {
                stringBuilder.Append(string.Format("<th class=\"header\">{0}</th>", FormatTitle(column.ColumnName)));
            }
            int i = 1;
            foreach (DataRow dataRow in dataTable.Rows)
            {
                stringBuilder.Append("<tr>");
                foreach (DataColumn dataColumn in dataTable.Columns)
                {
                    stringBuilder.Append(string.Format("<td{1}>{0}</td>", dataRow[dataColumn], i % 2 == 0 ? " class=\"alterrow\"" : ""));
                }
                i = i == 1 ? 0 : 1;
                stringBuilder.Append("</tr>");
            }
            stringBuilder.Append("</tr>");
            stringBuilder.Append("</table></body></html>");
            return stringBuilder.ToString();
        }

        private static string FormatTitle(string columnName)
        {
            if (columnName.Equals("MASOBITICH"))
                return "Mã Số Bí Tích";
            if (columnName.Equals("MAGIAODAN"))
                return "Mã Giáo Dân";
            if (columnName.Equals("TENTHANH"))
                return "Tên Thánh";
            if (columnName.Equals("HOVATEN"))
                return "Họ Và Tên";
            if (columnName.Equals("NGAYSINH"))
                return "Ngày Sinh";
            if (columnName.Equals("TENGIAOHO"))
                return "Tên Giáo Họ";
            if (columnName.Equals("TENCHA"))
                return "Tên Cha";
            if (columnName.Equals("TENME"))
                return "Tên Mẹ";
            if (columnName.Equals("DIADIEM"))
                return "Địa Điểm";
            if (columnName.Equals("TENLINHMUC"))
                return "Tên Linh Mục";
            if (columnName.Equals("TENNGUOIDODAU"))
                return "Tên Người Đỡ Đầu";
            if (columnName.Equals("NGAYLANHNHAN"))
                return "Ngày Lãnh Nhận";
            if (columnName.Equals("GHICHU"))
                return "Ghi Chú";
            if (columnName.Equals("NGAYTATHE"))
                return "Ngày Tạ Thế";
            if (columnName.Equals("DIADIEMANTANG"))
                return "Địa Điểm An Táng";
            if (columnName.Equals("MATTAI"))
                return "Mất Tại";
            if (columnName.Equals("TENCHUCVU"))
                return "Tên Chức Vụ";
            if (columnName.Equals("DONGTU"))
                return "Dòng Tu";
            if (columnName.Equals("PHUCVUTAI"))
                return "Phục Vụ Tại";
            if (columnName.Equals("HOITUC"))
                return "Hồi Tục";
            if (columnName.Equals("NGAYNHAMCHUC"))
                return "Ngày Nhậm Chức";
            if (columnName.Equals("NHAMCHUCTAI"))
                return "Nhậm Chức Tại";
            if (columnName.Equals("DIENTHOAI"))
                return "Điện Thoại";
            if (columnName.Equals("TUOI"))
                return "Tuổi";
            if (columnName.Equals("GIOITINH"))
                return "Giới Tính";
            if (columnName.Equals("MAHONNHAN"))
                return "Mã Hôn Nhân";
            if (columnName.Equals("GIAODANID_CHONG"))
                return "Mã Giáo Dân";
            if (columnName.Equals("TENCHONG"))
                return "Tên Chồng";
            if (columnName.Equals("GIAODANID_VO"))
                return "Mã Giáo Dân";
            if (columnName.Equals("TENVO"))
                return "Tên Vợ";
            if (columnName.Equals("TENNHANCHUNG1"))
                return "Nhân Chứng 1";
            if (columnName.Equals("TENNHANCHUNG2"))
                return "Nhân Chứng 2";
            if (columnName.Equals("NGAYKETHON"))
                return "Ngày Kết Hôn";
            if (columnName.Equals("TENHIENTRANGHONNHAN"))
                return "Hiện Trạng Hôn Nhân";
            if (columnName.Equals("TENTONGIAO"))
                return "Tôn Giáo";
            if (columnName.Equals("HOGIADINHID"))
                return "Mã Hộ Gia Đình";
            if (columnName.Equals("TENCHUHO"))
                return "Tên Chủ Hộ";
            if (columnName.Equals("DIENTHOAI"))
                return "Điện Thoại";
            if (columnName.Equals("FAX"))
                return "Fax";
            if (columnName.Equals("EMAIL"))
                return "Email";
            if (columnName.Equals("TENHOANCANHKINHTE"))
                return "Tên Hoàn Cảnh Kinh Tế";
            if (columnName.Equals("TENQUANHEGIATOC"))
                return "Quan Hệ Với Chủ Hộ";
            if (columnName.Equals("GIAODANID"))
                return "Mã Giáo Dân";
            if (columnName.Equals("DIACHI"))
                return "Địa Chỉ";
            if (columnName.Equals("DANTOC"))
                return "Dân Tộc";
            if (columnName.Equals(""))
                return "";
            //if (columnName.Equals(""))
            //return "";
            return columnName;
        }

        public static string RuocLe(string year)
        {
            int i = 0;
            int.TryParse(year, out i);
            DataItem dataItem = new DataItem();
            dataItem["Year"] = i;
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout(dataItem, "sp_Report_RuocLe"));
        }

        public static string ThemSuc(string year)
        {
            int i = 0;
            int.TryParse(year, out i);
            DataItem dataItem = new DataItem();
            dataItem["Year"] = i;
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout(dataItem, "sp_Report_ThemSuc"));
        }

        public static string ChuaRuaToi()
        {
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout("sp_Report_ChuaRuaToi"));
        }

        public static string ChuaRuocLe()
        {
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout("sp_Report_ChuaRuocLe"));
        }

        public static string ChuaThemSuc()
        {
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout("sp_Report_ChuaThemSuc"));
        }

        public static string XucDau(string year)
        {
            int i = 0;
            int.TryParse(year, out i);
            DataItem dataItem = new DataItem();
            dataItem["Year"] = i;
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout(dataItem, "sp_Report_XucDau"));
        }

        public static string TaThe(string year)
        {
            int i = 0;
            int.TryParse(year, out i);
            DataItem dataItem = new DataItem();
            dataItem["Year"] = i;
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout(dataItem, "sp_Report_TaThe"));
        }

        public static string TanHien(string year)
        {
            int i = 0;
            int.TryParse(year, out i);
            DataItem dataItem = new DataItem();
            dataItem["Year"] = i;
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout(dataItem, "sp_Report_TanHien"));
        }

        public static string GiaoDan()
        {
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout("sp_Report_GiaoDan"));
        }

        public static string HonNhan(string year)
        {
            int i = 0;
            int.TryParse(year, out i);
            DataItem dataItem = new DataItem();
            dataItem["Year"] = i;
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout(dataItem, "sp_Report_HonNhan"));
        }

        public static string HoGiaDinh()
        {
            return FormatResult(InfoTech.Core.Data.Receiver.UnTypeObject.SelectTableLayout("sp_Report_HoGiaDinh"));
        }

        public static string ThongTinHoGiaDinh(string id, bool isFullReport)
        {
            StringBuilder stringBuilder = new StringBuilder();
            CreateHeader(stringBuilder);

            DataContext dataContext = CreateDataContext();
            Guid? guid = null;
            Guid temp;
            if (Guid.TryParse(id, out temp))
                guid = temp;
            var hogd = dataContext.GetTable<HOGIADINH>().Where(c => c.MAHOGIADINH == guid || guid == null);
            ThongTinHoGiaDinh(stringBuilder, dataContext, hogd, isFullReport);

            CreateFooter(stringBuilder);
            return stringBuilder.ToString();
        }

        private static void ThongTinHoGiaDinh(StringBuilder stringBuilder, DataContext dataContext, IQueryable<HOGIADINH> hogd, bool isFullReport)
        {
            var query =
            hogd.GroupJoin(
            dataContext.GetTable<GIAOHO>(), c => c.MAGIAOHO, v => v.MAGIAOHO, (c, v) => new { c, v }).SelectMany(
            c => c.v.DefaultIfEmpty(), (t, v) => new { t.c, v });
            var query1 = query.Join(
                dataContext.GetTable<HOGIADINH_GIAODAN>().Where(
                    c => c.DACHUYENDI == null && c.MAHOGIADINH_CHUYENDI == null),
                c => c.c.MAHOGIADINH, v => v.MAHOGIADINH,
                (c, v) => new { c, v }).Join(
                    dataContext.GetTable<GIAODAN>().Where(b => b.GIAODANID != null), c => c.v.MAGIAODAN,
                    v => v.MAGIAODAN, (c, v) => new { c, v }).GroupJoin(dataContext.GetTable<QUANHEGIATOC>(),
                                                                      c => c.c.v.MAQUANHEGIATOC, v => v.MAQUANHEGIATOC,
                                                                      (c, v) => new { c, v }).SelectMany(
                                                                          c => c.v.DefaultIfEmpty(),
                                                                          (c, v) => new { c, v, c.c.v.MAGIAODAN });
            var query2 =
                query1.Join(dataContext.GetTable<SOBITICH>(), c => c.c.c.v.MAGIAODAN, v => v.MAGIAODAN,
                            (c, v) => new { c, v });
            foreach (var hogiadinh in query)
            {
                var q1 = query1.Where(c => c.c.c.c.v.MAHOGIADINH == hogiadinh.c.MAHOGIADINH).Select(c => c.c.c.v);
                var q2 = query2.Join(q1, c => c.c.c.c.c.v.MAGIAODAN, v => v.MAGIAODAN, (c, v) => c.v);
                var q3 =
                    query1.Where(c => c.c.c.c.v.MAHOGIADINH == hogiadinh.c.MAHOGIADINH).Select(
                        c => new Temp1() { MAGIAODAN = c.MAGIAODAN, Quanhegiatoc = c.v });
                CreateReport(stringBuilder, hogiadinh.c, hogiadinh.v, q1, q2, q3, isFullReport);
            }
        }

        private static void ThongTinHoGiaDinh(StringBuilder stringBuilder, DataContext dataContext, GIAOHO giaoho, bool isFullReport)
        {
            var hogd = dataContext.GetTable<HOGIADINH>().Where(c => c.MAGIAOHO == giaoho.MAGIAOHO);
            ThongTinHoGiaDinh(stringBuilder, dataContext, hogd, isFullReport);
        }

        private static void CreateFooter(StringBuilder stringBuilder)
        {
            stringBuilder.Append("</body></html>");
        }

        private static void CreateHeader(StringBuilder stringBuilder)
        {
            stringBuilder.Append(
            "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" /><title>Báo Cáo</title><style type=\"text/css\"> .border1 td { border-color: #95B3D7; border-style: solid; } .border1 td.borderfull1 { background-color: #95B3D7; color: White; } .border2 td { border-color: #991A32; border-style: solid; } .border2 td.borderfull1 { background-color: #991A32; color: White; } .border3 td { border-color: transparent; border-style: none; } </style></head><body>");
        }

        private static void CreateReport(StringBuilder stringBuilder, HOGIADINH hogiadinh, GIAOHO giaoho, IEnumerable<GIAODAN> giaodans, IEnumerable<SOBITICH> sobitichs, IEnumerable<Temp1> q3, bool isFullReport)
        {
            var chuho = giaodans.Where(c => c.MAGIAODAN == hogiadinh.MACHUHO).FirstOrDefault();
            string tenChuHo = "";
            if (chuho != null)
                tenChuHo = chuho.GetFullName();
            CreateTableStyle2(stringBuilder, string.Format("Tên Chủ Hộ : <b>{0}</b>", tenChuHo), string.Format("<b>{0}.{1:00000}</b>", giaoho.MAHOID, hogiadinh.HOGIADINHID));
            stringBuilder.AppendFormat(
            "<table class=\"border3\" cellpadding=\"0\" cellspacing=\"1\"><tr><td>Địa Chỉ&nbsp; :</td><td>{0}</td><td width=\"20\">&nbsp;</td><td>Giáo Họ :</td><td>{1}</td></tr><tr><td>Điện Thoại :</td><td>{2}</td><td>&nbsp;</td><td>Email :</td><td>&nbsp;{3}</td></tr><tr><td>Fax :</td><td>{4}</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr></table>",
            hogiadinh.DIACHI, giaoho.TENGIAOHO, hogiadinh.DIENTHOAI, hogiadinh.EMAIL, hogiadinh.FAX);
            CreateTableFooter(stringBuilder);
            stringBuilder.Append("<p/>");
            var query =
                giaodans.Join(q3, c => c.MAGIAODAN, v => v.MAGIAODAN, (c, v) => new { c, QUANHEGIATOC = v.Quanhegiatoc }).
                    OrderBy(c => c.QUANHEGIATOC.PRIORITY).ThenBy(c => c.c.NAMSINH).ThenBy(c => c.c.THANGSINH).ThenBy(
                        c => c.c.NGAYSINH).ThenBy(c => c.c.TEN).ThenBy(c => c.c.HOVATENDEM).ThenBy(c => c.c.TENTHANH);
            foreach (var giaodan in query)
            {
                if (isFullReport)
                    ThongTinGiaoDan(stringBuilder, hogiadinh, giaoho, giaodan.c, sobitichs.Where(c => c.MAGIAODAN == giaodan.c.MAGIAODAN).OrderBy(c => c.MABITICH), giaodan.QUANHEGIATOC);
                else
                    ThongTinGiaoDan(stringBuilder, hogiadinh, giaoho, giaodan.c, giaodan.QUANHEGIATOC);
                stringBuilder.Append("<p/>");
            }
        }

        private static void ThongTinGiaoDan(StringBuilder stringBuilder, HOGIADINH hogiadinh, GIAOHO giaoho, GIAODAN giaodan, QUANHEGIATOC quanhegiatoc)
        {
            CreateTableStyle1(stringBuilder, string.Format("Tên Giáo Dân : <b>{0}</b>", giaodan.GetFullName()),
              string.Format("<b>{0}.{1:00000}.{2:00000}</b>", giaoho.MAHOID, hogiadinh.HOGIADINHID, giaodan.GIAODANID));
            string quanhe = "";
            if (quanhegiatoc != null)
                quanhe = quanhegiatoc.TENQUANHEGIATOC;
            stringBuilder.AppendFormat(
            "<table class=\"border3\" cellpadding=\"0\" cellspacing=\"1\"><tr><td>Ngày Sinh</td><td>{0}</td><td width=\"20\">&nbsp;</td><td>Giới Tính</td><td>{1}</td><td valign=\"20\"></td><td>Tên Cha :</td><td>{5}</td></tr><tr><td>Quan Hệ Với Chủ Hộ :</td><td>{7}</td><td></td><td>Dân Tộc :</td><td>{2}</td><td>&nbsp;</td><td>Tên Mẹ :</td><td>{6}</td></tr><tr><td>Địa Chỉ :</td><td>{3}</td><td></td><td>Điện Thoại :</td><td>{4}</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>",
            giaodan.GetBirthDay(), giaodan.GIOITINH == true ? "Nữ" : "Nam", giaodan.DANTOC, giaodan.DIACHI,
            giaodan.DIENTHOAI, giaodan.TENCHA, giaodan.TENME, quanhe);
            stringBuilder.Append("</table>");
            CreateTableFooter(stringBuilder);
        }

        private static void ThongTinGiaoDan(StringBuilder stringBuilder, HOGIADINH hogiadinh, GIAOHO giaoho, GIAODAN giaodan, IEnumerable<SOBITICH> sobitichs, QUANHEGIATOC quanhegiatoc)
        {
            CreateTableStyle1(stringBuilder, string.Format("Tên Giáo Dân : <b>{0}</b>", giaodan.GetFullName()),
              string.Format("<b>{0}.{1:00000}.{2:00000}</b>", giaoho.MAHOID, hogiadinh.HOGIADINHID, giaodan.GIAODANID));
            SOBITICH ruatoi = sobitichs.FirstOrDefault(c => c.MABITICH == 1);
            if (ruatoi == null)
                ruatoi = new SOBITICH();
            SOBITICH ruocLe = sobitichs.FirstOrDefault(c => c.MABITICH == 2);
            if (ruocLe == null)
                ruocLe = new SOBITICH();
            SOBITICH themsuc = sobitichs.FirstOrDefault(c => c.MABITICH == 3);
            if (themsuc == null)
                themsuc = new SOBITICH();
            string quanhe = "";
            if (quanhegiatoc != null)
                quanhe = quanhegiatoc.TENQUANHEGIATOC;
            stringBuilder.AppendFormat(
            "<table class=\"border3\" cellpadding=\"0\" cellspacing=\"1\"><tr><td>Ngày Sinh</td><td>{0}</td><td width=\"20\">&nbsp;</td><td>Giới Tính</td><td>{1}</td><td valign=\"20\"></td><td>Tên Cha :</td><td>{5}</td></tr><tr><td>Quan Hệ Với Chủ Hộ :</td><td>{21}</td><td></td><td>Dân Tộc :</td><td>{2}</td><td>&nbsp;</td><td>Tên Mẹ :</td><td>{6}</td></tr><tr><td>Địa Chỉ :</td><td>{3}</td><td></td><td>Điện Thoại :</td><td>{4}</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td colspan=\"5\"><strong>Rửa Tội</strong></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>Sổ Rửa Tội Số:</td><td>{7}</td><td></td><td>Ngày :</td><td>{8}</td><td>&nbsp;</td><td>Do Linh Mục :</td><td>{10}</td></tr><tr><td>Tại :</td><td colspan=\"4\">{9}</td><td>&nbsp;</td><td>Người Đỡ Đầu :</td><td>{11}</td></tr><tr><td colspan=\"5\"><strong>Rước Lễ</strong></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>Sổ Rước Lễ Số :</td><td>{12}</td><td></td><td>Ngày :</td><td>{13}</td><td>&nbsp;</td><td>Do Linh Mục :</td><td>{15}</td></tr><tr><td>Tại :</td><td colspan=\"4\">{14}</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td colspan=\"5\"><strong>Thêm Sức</strong></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>Sổ Thêm Sức Số :</td><td>{16}</td><td></td><td>Ngày :</td><td>{17}</td><td>&nbsp;</td><td>Do Linh Mục :</td><td>{19}</td></tr><tr><td>Tại :</td><td colspan=\"4\">{18}</td><td>&nbsp;</td><td>Người Đỡ Đầu :</td><td>{20}</td></tr>",
            giaodan.GetBirthDay(), giaodan.GIOITINH == true ? "Nữ" : "Nam", giaodan.DANTOC, giaodan.DIACHI,
            giaodan.DIENTHOAI, giaodan.TENCHA, giaodan.TENME,
            ruatoi.MASO, ruatoi.GetNgayNhan(), ruatoi.DIADIEM, ruatoi.TENLINHMUC, ruatoi.TENNGUOIDODAU,
            ruocLe.MASO, ruocLe.GetNgayNhan(), ruocLe.DIADIEM, ruocLe.TENLINHMUC,
            themsuc.MASO, themsuc.GetNgayNhan(), themsuc.DIADIEM, themsuc.TENLINHMUC, themsuc.TENNGUOIDODAU, quanhe);
            stringBuilder.Append("</table>");
            CreateTableFooter(stringBuilder);
        }

        public static string ThongTinGiaoDan(GIAODAN giaodan)
        {
            StringBuilder stringBuilder = new StringBuilder();
            CreateHeader(stringBuilder);
            HOGIADINH hogiadinh = null;
            HOGIADINH_GIAODAN hogiadinhDiachi = giaodan.REF_HOGIADINH_GIAODAN.FirstOrDefault(c => c.DACHUYENDI == null && c.MAHOGIADINH_CHUYENDI == null);
            if (hogiadinhDiachi != null)
                hogiadinh = hogiadinhDiachi.PRT_HOGIADINH;
            if (hogiadinh == null)
                hogiadinh = new HOGIADINH();
            if (!giaodan.PRT_GIAOHO.IsPersistence)
                giaodan.PRT_GIAOHO = new GIAOHO();
            ThongTinGiaoDan(stringBuilder, hogiadinh, giaodan.PRT_GIAOHO, giaodan, giaodan.REF_SOBITICH);
            CreateFooter(stringBuilder);
            return stringBuilder.ToString();
        }

        private static void ThongTinGiaoDan(StringBuilder stringBuilder, HOGIADINH hogiadinh, GIAOHO giaoho, GIAODAN giaodan, IEnumerable<SOBITICH> sobitichs)
        {
            CreateTableStyle1(stringBuilder, string.Format("Tên Giáo Dân : <b>{0}</b>", giaodan.GetFullName()),
              string.Format("<b>{0}.{1:00000}.{2:00000}</b>", giaoho.MAHOID, hogiadinh.HOGIADINHID, giaodan.GIAODANID));
            SOBITICH ruatoi = sobitichs.FirstOrDefault(c => c.MABITICH == 1);
            if (ruatoi == null)
                ruatoi = new SOBITICH();
            SOBITICH ruocLe = sobitichs.FirstOrDefault(c => c.MABITICH == 2);
            if (ruocLe == null)
                ruocLe = new SOBITICH();
            SOBITICH themsuc = sobitichs.FirstOrDefault(c => c.MABITICH == 3);
            if (themsuc == null)
                themsuc = new SOBITICH();
            stringBuilder.AppendFormat(
            "<table class=\"border3\" cellpadding=\"2\" cellspacing=\"2\"><tr><td>Ngày Sinh</td><td>{0}</td><td width=\"20\">&nbsp;</td><td>Giới Tính</td><td>{1}</td><td valign=\"20\"></td><td>Tên Cha :</td><td>{5}</td></tr><tr><td></td><td></td><td></td><td>Dân Tộc :</td><td>{2}</td><td>&nbsp;</td><td>Tên Mẹ :</td><td>{6}</td></tr><tr><td>Địa Chỉ :</td><td>{3}</td><td></td><td>Điện Thoại :</td><td>{4}</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td colspan=\"5\"><strong>Rửa Tội</strong></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>Sổ Rửa Tội Số:</td><td>{7}</td><td></td><td>Ngày :</td><td>{8}</td><td>&nbsp;</td><td>Do Linh Mục :</td><td>{10}</td></tr><tr><td>Tại :</td><td colspan=\"4\">{9}</td><td>&nbsp;</td><td>Người Đỡ Đầu :</td><td>{11}</td></tr><tr><td colspan=\"5\"><strong>Rước Lễ</strong></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>Sổ Rước Lễ Số :</td><td>{12}</td><td></td><td>Ngày :</td><td>{13}</td><td>&nbsp;</td><td>Do Linh Mục :</td><td>{15}</td></tr><tr><td>Tại :</td><td colspan=\"4\">{14}</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td colspan=\"5\"><strong>Thêm Sức</strong></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>Sổ Thêm Sức Số :</td><td>{16}</td><td></td><td>Ngày :</td><td>{17}</td><td>&nbsp;</td><td>Do Linh Mục :</td><td>{19}</td></tr><tr><td>Tại :</td><td colspan=\"4\">{18}</td><td>&nbsp;</td><td>Người Đỡ Đầu :</td><td>{20}</td></tr>",
            giaodan.GetBirthDay(), giaodan.GIOITINH == true ? "Nữ" : "Nam", giaodan.DANTOC, giaodan.DIACHI,
            giaodan.DIENTHOAI, giaodan.TENCHA, giaodan.TENME,
            ruatoi.MASO, ruatoi.GetNgayNhan(), ruatoi.DIADIEM, ruatoi.TENLINHMUC, ruatoi.TENNGUOIDODAU,
            ruocLe.MASO, ruocLe.GetNgayNhan(), ruocLe.DIADIEM, ruocLe.TENLINHMUC,
            themsuc.MASO, themsuc.GetNgayNhan(), themsuc.DIADIEM, themsuc.TENLINHMUC, themsuc.TENNGUOIDODAU);
            ReportHonNhan(stringBuilder, giaodan);
            stringBuilder.Append("</table>");

            CreateTableFooter(stringBuilder);
        }

        private static void ReportHonNhan(StringBuilder stringBuilder, GIAODAN giaodan)
        {
            SOHONNHAN sohonnhan = null;
            if (giaodan.GIOITINH == true)
            {
                sohonnhan = giaodan.REF_SOHONNHAN_VO.FirstOrDefault(c => c.LYHON == null);
            }
            else
            {
                sohonnhan = giaodan.REF_SOHONNHAN_CHONG.FirstOrDefault(c => c.LYHON == null);
            }
            if (sohonnhan != null)
            {
                string ten, tencha, tenme;
                if (giaodan.GIOITINH.HasValue)
                {
                    if (giaodan.GIOITINH.Value)
                    {
                        ten = sohonnhan.TENCHONG;
                        if (sohonnhan.PRT_GIAODAN_CHONG.IsPersistence)
                        {
                            tencha = sohonnhan.PRT_GIAODAN_CHONG.TENCHA;
                            tenme = sohonnhan.PRT_GIAODAN_CHONG.TENME;
                        }
                        else
                        {
                            tencha = sohonnhan.TENCHA;
                            tenme = sohonnhan.TENME;
                        }
                    }
                    else
                    {
                        ten = sohonnhan.TENVO;
                        if (sohonnhan.PRT_GIAODAN_VO.IsPersistence)
                        {
                            tencha = sohonnhan.PRT_GIAODAN_VO.TENCHA;
                            tenme = sohonnhan.PRT_GIAODAN_VO.TENME;
                        }
                        else
                        {
                            tencha = sohonnhan.TENCHA;
                            tenme = sohonnhan.TENME;
                        }
                    }
                }
                else
                {
                    ten = sohonnhan.TENVO;
                    if (sohonnhan.PRT_GIAODAN_VO.IsPersistence)
                    {
                        tencha = sohonnhan.PRT_GIAODAN_VO.TENCHA;
                        tenme = sohonnhan.PRT_GIAODAN_VO.TENME;
                    }
                    else
                    {
                        tencha = sohonnhan.TENCHA;
                        tenme = sohonnhan.TENME;
                    }
                }
                stringBuilder.AppendFormat(
                "<tr><td colspan=\"8\"><strong>Hôn Nhân</strong></td></tr><tr><td>Sổ Hôn Nhân Số :</td><td>{0}</td><td>&nbsp;</td><td>Ngày</td><td>{1}</td><td>&nbsp;</td><td>Hiện Trạng Hôn Nhân :</td><td>{2}</td></tr><tr><td>Tên Chồng(Vợ) :</td><td>{3}</td><td>&nbsp;</td><td>Tên Cha :</td><td>{4}</td><td>&nbsp;</td><td>Tên Mẹ :</td><td>{5}</td></tr><tr><td>Tại :</td><td>{6}</td><td>&nbsp;</td><td>Nhân Chứng 1 :</td><td>{7}</td><td>&nbsp;</td><td>Nhân Chứng 2 :</td><td>{8}</td></tr><tr><td>Do Linh Mục</td><td>{9}</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>",
                sohonnhan.MASO, sohonnhan.GetNgayCuoi(),
                sohonnhan.PRT_HIENTRANGHONNHAN.IsPersistence
                ? sohonnhan.PRT_HIENTRANGHONNHAN.TENHIENTRANGHONNHAN
                : "",
                ten, tencha, tenme, sohonnhan.DIACHI, sohonnhan.TENNHANCHUNG1, sohonnhan.TENNHANCHUNG2,
                sohonnhan.TENLINHMUC
                );
            }
        }

        private static void CreateTableFooter(StringBuilder stringBuilder)
        {
            stringBuilder.Append(
            "</td><td style=\"border-width: 0px 2px 0px 0px;\">&nbsp;</td></tr><tr><td style=\"border-width: 0px 0px 2px 2px; border-width: 0px 0px 2px 2px; -moz-border-radius: 0 0 0 4px;-webkit-border-radius: 0 0 0 4px;\">&nbsp;</td><td style=\"border-width: 0px 0px 2px 0px;\">&nbsp;</td><td style=\"border-width: 0px 0px 2px 0px;\">&nbsp;</td><td style=\"border-width: 0px 0px 2px 0px;\">&nbsp;</td><td style=\"border-width: 0px 2px 2px 0px; border-width: 0px 2px 2px 0px; -moz-border-radius: 0 0 4px 0;-webkit-border-radius: 0 0 4px 0;\">&nbsp;</td></tr></tbody></table>");
        }

        private static void CreateTableStyle1(StringBuilder stringBuilder, string header, string id)
        {
            CreateTableStyle(stringBuilder, "border1", header, id);
        }

        private static void CreateTableStyle2(StringBuilder stringBuilder, string header, string id)
        {
            CreateTableStyle(stringBuilder, "border2", header, id);
        }

        private static void CreateTableStyle(StringBuilder stringBuilder, string classStyle, string header, string id)
        {
            stringBuilder.AppendFormat("<table cellpadding=\"0\" cellspacing=\"0\" style=\"width: 100%\" class=\"{0}\"><tbody><tr><td width=\"20\" style=\"border:none\">&nbsp;</td><td rowspan=\"2\" width=\"500\" style=\"border-width: 2px; -moz-border-radius: 4px; -webkit-border-radius: 4px;padding-left:10px;\">{1}</td><td style=\"border-width: 0px 0px 1px 0px;\">&nbsp;</td><td align=\"center\" class=\"borderfull1\" rowspan=\"2\" style=\"border-width: 2px; -moz-border-radius: 4px;-webkit-border-radius: 4px;\" width=\"150\">{2}</td><td width=\"20\" style=\"border:none\">&nbsp;</td></tr><tr><td style=\"border-width: 2px 0 0 2px; -moz-border-radius: 4px 0 0 0; -webkit-border-radius: 4px 0 0 0;\">&nbsp;</td><td style=\"border-width: 1px 0px 0px 0px;\">&nbsp;</td><td style=\"border-width: 2px 2px 0px 0px; -moz-border-radius: 0 4px 0 0; -webkit-border-radius: 0 4px 0 0;\">&nbsp;</td></tr><tr><td style=\"border-width: 0px 0px 0px 2px;\">&nbsp;</td><td colspan=\"3\" style=\"border:none\">", classStyle, header, id);
        }

        public static string ThongTinHoGiaoHo(string id, bool isFullReport)
        {
            DataContext dataContext = CreateDataContext();
            Guid? guid = null;
            Guid temp;
            if (Guid.TryParse(id, out temp))
                guid = temp;
            StringBuilder stringBuilder = new StringBuilder();
            CreateHeader(stringBuilder);
            var query = dataContext.GetTable<GIAOHO>().Where(c => c.MAGIAOHO == guid || guid == null);
            foreach (GIAOHO giaoho in query)
            {
                ThongTinHoGiaDinh(stringBuilder, dataContext, giaoho, isFullReport);
            }
            CreateFooter(stringBuilder);
            return stringBuilder.ToString();
        }

        public static string ThongTinGiaoDan(string id)
        {
            Guid guid;
            if (Guid.TryParse(id, out guid))
            {
                GIAODAN giaodan = new GIAODAN();
                giaodan.MAGIAODAN = guid;
                giaodan.SelectbyId();
                if (giaodan.IsPersistence)
                    return ThongTinGiaoDan(giaodan);
            }
            return "";
        }

        public static string ThongTinHoGiaDinh(string id)
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.Append(
            "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title></title><style type=\"text/css\">.style1{width: 90%;}.style1 td{border: 1px solid black;}</style></head><body>");

            DataContext dataContext = CreateDataContext();
            Guid? guid = null;
            Guid temp;
            if (Guid.TryParse(id, out temp))
                guid = temp;
            var hogd = dataContext.GetTable<HOGIADINH>().Where(c => c.MAHOGIADINH == guid || guid == null);
            bool first = true;
            ThongTinHoGiaDinh(stringBuilder, dataContext, hogd, ref first);

            stringBuilder.Append("</body></html>");
            return stringBuilder.ToString();
        }

        private static void ThongTinHoGiaDinh(StringBuilder stringBuilder, DataContext dataContext, IQueryable<HOGIADINH> hogd, ref bool first)
        {
            var query =
            hogd.GroupJoin(
            dataContext.GetTable<GIAOHO>(), c => c.MAGIAOHO, v => v.MAGIAOHO, (c, v) => new { c, v }).SelectMany(
            c => c.v.DefaultIfEmpty(), (t, v) => new { t.c, v });
            var query1 = query.Join(
                dataContext.GetTable<HOGIADINH_GIAODAN>()
                //.Where(c => c.DACHUYENDI == null && c.MAHOGIADINH_CHUYENDI == null)
                , c => c.c.MAHOGIADINH, v => v.MAHOGIADINH,
                (c, v) => new { c, v }).Join(
                    dataContext.GetTable<GIAODAN>().Where(b => b.GIAODANID != null), c => c.v.MAGIAODAN,
                    v => v.MAGIAODAN, (c, v) => new { c, v }).GroupJoin(dataContext.GetTable<QUANHEGIATOC>(),
                                                                      c => c.c.v.MAQUANHEGIATOC, v => v.MAQUANHEGIATOC,
                                                                      (c, v) => new { c, v }).SelectMany(
                                                                          c => c.v.DefaultIfEmpty(),
                                                                          (c, v) => new { c, v, c.c.v.MAGIAODAN });
            foreach (var hogiadinh in query)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    stringBuilder.Append("<br style=\"page-break-before:always\" />");
                }
                var q1 = query1.Where(c => c.c.c.c.v.MAHOGIADINH == hogiadinh.c.MAHOGIADINH).Select(c => c.c.c.v);
                var q3 =
                    query1.Where(c => c.c.c.c.v.MAHOGIADINH == hogiadinh.c.MAHOGIADINH).Select(
                        c =>
                        new Temp1()
                            {
                                MAGIAODAN = c.MAGIAODAN,
                                Quanhegiatoc = c.v,
                                DaChuyenDi = (c.c.c.c.v.DACHUYENDI == true || c.c.c.c.v.MAHOGIADINH_CHUYENDI != null)
                            });
                CreateReport(stringBuilder, hogiadinh.c, hogiadinh.v, q1, q3);
            }
        }

        private static void CreateReport(StringBuilder stringBuilder, HOGIADINH hogiadinh, GIAOHO giaoho, IQueryable<GIAODAN> giaodans, IQueryable<Temp1> q3)
        {
            var chuho = giaodans.Where(c => c.MAGIAODAN == hogiadinh.MACHUHO).FirstOrDefault();
            string tenChuHo = "";
            if (chuho != null)
                tenChuHo = chuho.GetFullName();
            stringBuilder.AppendFormat(
            "<h4><strong>Giáo Phận {0}<br />Giáo Hạt {1}<br />Giáo Xứ {2}</strong></h4><p /><div><table><tr><td colspan=\"4\" align=\"left\"><i>Chủ Hộ Gia Đình(Tên thánh, họ và tên):</i> <strong>{3}</strong></td></tr><tr><td><em>Địa Chỉ :</em></td><td colspan=\"3\" align=\"left\">{4}&nbsp;</td></tr><tr><td><em>Email :</em></td><td>{6}</td><td><em>Điện Thoại :</em></td><td>{5}</td></tr><tr><td></td><td></td><td><em>Fax :</em></td><td>{7}</td></tr></tr><tr><td><em>Thuộc Khu Xóm :</em></td><td>{8}</td><td></td><td></td></tr></table></div>&nbsp;<p /><div style=\"padding-left: 20px\"><strong>Người trong gia đình :</strong></div><br /><table cellpadding=\"3\" cellspacing=\"0\" class=\"style1\" align=\"center\"><tr><td align=\"center\" style=\"font-weight: bold; background-color: #C0C0C0\" width=\"70\">STT</td><td align=\"center\" style=\"font-weight: bold; background-color: #C0C0C0\">Họ Và Tên</td><td align=\"center\" style=\"font-weight: bold; background-color: #C0C0C0\" align=\"center\">Quan Hệ Với Chủ Hộ</td><td align=\"center\" style=\"font-weight: bold; background-color: #C0C0C0\">Ghi Chú</td></tr>",
            "Đàlạt", "Đức Trọng", "Lán Tranh", tenChuHo, hogiadinh.DIACHI, hogiadinh.DIENTHOAI, hogiadinh.EMAIL, hogiadinh.FAX, giaoho.TENGIAOHO);

            var query =
                giaodans.Join(q3, c => c.MAGIAODAN, v => v.MAGIAODAN,
                              (c, v) => new { c, QUANHEGIATOC = v.Quanhegiatoc, v.DaChuyenDi }).
                    OrderBy(c => c.QUANHEGIATOC.PRIORITY).ThenBy(c => c.c.NAMSINH).ThenBy(c => c.c.THANGSINH).ThenBy(
                        c => c.c.NGAYSINH).ThenBy(c => c.c.TEN).ThenBy(c => c.c.HOVATENDEM).ThenBy(c => c.c.TENTHANH);
            int count = 1;
            foreach (var giaodan in query)
            {
                stringBuilder.AppendFormat(
                "<tr><td align=\"center\">{0}</td><td>{1}</td><td align=\"center\">{2}</td><td>{3}</td></tr>",
                count++, giaodan.c.GetFullName(), giaodan.QUANHEGIATOC == null ? "" : giaodan.QUANHEGIATOC.TENQUANHEGIATOC, giaodan.DaChuyenDi.HasValue ? giaodan.DaChuyenDi.Value ? "Đã chuyển đi" : "" : "");
            }
            stringBuilder.Append("</table>");
        }

        public static string ThongTinHoGiaoHo(string id)
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.Append(
            "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title></title><style type=\"text/css\">.style1{width: 90%;}.style1 td{border: 1px solid black;}</style></head><body>");

            DataContext dataContext = CreateDataContext();
            Guid? guid = null;
            Guid temp;
            if (Guid.TryParse(id, out temp))
                guid = temp;
            var hogd = dataContext.GetTable<HOGIADINH>().Where(c => c.MAGIAOHO == guid || guid == null);
            bool first = true;
            ThongTinHoGiaDinh(stringBuilder, dataContext, hogd, ref first);

            stringBuilder.Append("</body></html>");
            return stringBuilder.ToString();
        }

        public static string ThongTinHoGiaoHo2(string id)
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.Append(
            "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title></title><style type=\"text/css\">.style1{width: 90%;}.style1 td{border: 1px solid black;}</style></head><body>");

            DataContext dataContext = CreateDataContext();
            Guid? guid = null;
            Guid temp;
            if (Guid.TryParse(id, out temp))
                guid = temp;
            var giaoho = dataContext.GetTable<GIAOHO>().Where(c => c.MAGIAOHO == guid || guid == null);
            var hogd =
                giaoho.Join(dataContext.GetTable<HOGIADINH>(), c => c.MAGIAOHO, v => v.MAGIAOHO,
                            (c, v) => new { v.MACHUHO, v.MAGIAOHO }).Join(dataContext.GetTable<GIAODAN>(),
                                                                        c => c.MACHUHO, v => v.MAGIAODAN,
                                                                        (c, v) => new { c.MAGIAOHO, v });

            bool isFirst = true;
            foreach (var giaoho1 in giaoho)
            {
                if (isFirst)
                    isFirst = false;
                else
                {
                    stringBuilder.Append("<br style=\"page-break-before:always\" />");
                }
                int count = 1;
                stringBuilder.AppendFormat(
               "<h4><strong>Giáo Phận {0}<br />Giáo Hạt {1}<br />Giáo Xứ {2}</strong></h4><p /><div align=\"center\"><em>Danh sách chủ hộ thuộc khu xóm :</em><b>{3}</b></div>&nbsp;<p /><div style=\"margin-top: 15px\"></div><table cellpadding=\"3\" cellspacing=\"0\" class=\"style1\" align=\"center\"><tr><td align=\"center\" style=\"font-weight: bold; background-color: #C0C0C0\" width=\"70\">STT</td><td align=\"center\" style=\"font-weight: bold; background-color: #C0C0C0\">Họ Và Tên</td><td align=\"center\" style=\"font-weight: bold; background-color: #C0C0C0\">Ghi Chú</td></tr>",
               "Đàlạt", "Đức Trọng", "Lán Tranh", giaoho1.TENGIAOHO);
                foreach (var giaodan in hogd.Where(c => c.MAGIAOHO == giaoho1.MAGIAOHO))
                {
                    stringBuilder.AppendFormat(
                        "<tr><td align=\"center\">{0}</td><td>{1}</td><td align=\"center\">{2}</td></tr>",
                        count++, giaodan.v.GetFullName(), "");
                }
                stringBuilder.Append("</table>");
            }

            stringBuilder.Append("</body></html>");
            return stringBuilder.ToString();
        }
    }

    public class Temp1
    {
        public Guid MAGIAODAN;
        private QUANHEGIATOC _quanhegiatoc;
        public bool? DaChuyenDi = false;
        public QUANHEGIATOC Quanhegiatoc
        {
            get
            {
                if (_quanhegiatoc == null)
                    _quanhegiatoc = new QUANHEGIATOC();
                return _quanhegiatoc;
            }
            set { _quanhegiatoc = value; }
        }
    }

}
